from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import pandas as pd
# 用于将降维后的二维矩阵保存到txt文件中
import numpy as np

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
print("数组维度：", X.shape)  # 二维数组
iris_dataFrame = pd.DataFrame(X)  # 四维特征矩阵
print("特征矩阵：\n", iris_dataFrame)

pca = PCA(n_components=2)  # n_components设置降维后的特征数，也就是降维后想保留的特征数目。
pca.fit(X)  # 拟合
X_new = pca.transform(X)  # 获取新矩阵
print("降维后的矩阵：\n", X_new)
print("降维后的维度：", X_new.shape)


# 矩阵以%d数据类型保存，并以","做分隔符保存到test.txt文件中
np.savetxt(r'test.txt',X_new, fmt='%s', delimiter=',')

# 3. 可视化
plt.figure()  # 获取画布
# 画0这类
plt.scatter(X_new[y == 0, 0], X_new[y == 0, 1], c='red', label=iris.target_names[0])
# 画1这类
plt.scatter(X_new[y == 1, 0], X_new[y == 1, 1], c='blue', label=iris.target_names[1])
# 画2这类
plt.scatter(X_new[y == 2, 0], X_new[y == 2, 1], c='green', label=iris.target_names[2])
plt.legend()  # 显示图例
plt.show()


# 降维后的数据分析：
print("方差：", pca.explained_variance_)

"""结果"""
# 方差： [4.22824171 0.24267075]  表示第一个特征方差很大，其上带有更多的信息量

print("可解释性方差贡献率：", pca.explained_variance_ratio_)

"""结果"""
# 可解释性方差贡献率： [0.92461872 0.05306648]  可解释性方差贡献率，也就是降维后的新特征信息量占原始数据信息量的比例，所以大部分有效信息集中在第一个特征上。

# 对上面两个比例求和，就可以得到在降维之后信息量占原始数据信息量的比例：
print("降维后信息量占原始比例：", pca.explained_variance_ratio_.sum())

"""结果"""
# 降维后信息量占原始比例： 0.9776852063187949








